#include "Timer.h"

extern Encoder_type encoder1, encoder2;
extern OpenMV_typedef openmv;
extern PID_Mode current_pid_mode;

volatile Timer_typeDef timer = {0};

uint32_t current_gray_value;


// SysTick 定时器初始化
void SysTick_Init(void)
{
    // 设置SysTick定时器，每1ms触发一次中断
    if (SysTick_Config(32000000 / 1000)) // SystemCoreClock is the system clock frequency
    {
        // SysTick初始化失败
        while (1);
    }
}


//自定义延时（不精确）
void delay_ms_nonblocking(unsigned int ms)
{
    unsigned int i, j;
    // 下面的嵌套循环的次数是根据主控频率和编译器生成的指令周期大致计算出来的，
    // 需要通过实际测试调整来达到所需的延时。
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 8000; j++)
        {
            // 仅执行一个足够简单以致于可以预测其执行时间的操作
            __asm__("nop"); // "nop" 代表“无操作”，在大多数架构中，这会消耗一个或几个时钟周期
        }
    }
}


volatile unsigned int delay_times = 0;

//搭配滴答定时器实现的精确ms延时
void delay_ms(unsigned int ms)
{
    delay_times = ms;
    while( delay_times != 0 );
}

volatile unsigned int delay_times_timer = 0;

//搭配定时器实现的精确ms延时
void delay_ms_timer(unsigned int ms)
{
    uint32_t start_time = timer.count;
    while( timer.count - start_time <= ms )
	{
		__asm__("nop");
		__asm__("nop");
	} 
}


//滴答定时器中断服务函数
void SysTick_Handler(void)
{
    if( delay_times != 0 )
    {
        delay_times--;
    }
	timer.sys_ms_count++;
}


//定时器的中断服务函数 已配置为1秒的周期
void TIMER_0_INST_IRQHandler(void)
{
    //如果产生了定时器中断
    switch( DL_TimerG_getPendingInterrupt(TIMER_0_INST) )
    {
        case DL_TIMER_IIDX_ZERO:	//如果是0溢出中断

//				encoder1.speed = ENCODER_Calc_v(encoder1.count, 100);
//				encoder2.speed = ENCODER_Calc_v(encoder2.count, 100);
//				encoder1.count = 0;
//				encoder2.count = 0;

				timer.ms_count++;
				timer.count++;
		
				// 是否读取6050数据
				if(timer.ms_count%100 == 0 && timer.mpu_flag >= 1)
				{
					JP61P_Read();
					if(timer.mpu_flag == 2)
						fAngle[2] = Tool_Filter_MPU6050(FLITER_POSITIVE, fAngle[2]);	// 正滤波
				}
								
//				if(timer.ms_count%1000 == 0)
//				{
//					timer.second++;
//				}
					
				if(timer.state == STATE_OPEN_LOOP)
					return;
				
				if(timer.state == STATE_CLOSED_LOOP)
				{
					current_gray_value = GRAY1_Calc();
					// timer.state = GRAY_Situation(current_gray_value);
					openmv.cross_flag = Gray_CrossJudge();
						return;			
				}
					
				if(timer.state == STATE_PID_MODE && timer.count%100 ==0)
					PID_ModeChoose(current_pid_mode);
						return;
						
				if(timer.state == STATE_OTHER)
				{
						return;			
				}

				break;

        default:					//其他的定时器中断
				break;
    }
}

